prepare for deprecation of qmake. (#920)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Fri, 23 Sep 2022 12:46:08 +0000 (06:46 -0600)
committerGitHub <noreply@github.com>
Fri, 23 Sep 2022 12:46:08 +0000 (06:46 -0600)
* prepare for deprecation of qmake.

build a release level package in CI with cmake on windows & macOS.
this can be compared with the release package build in CI with qmake.

support cmake multi-config generators on macOS (e.g. Xcode) as well
as well as single-config generators (.e.g Unix Makefiles, Ninja).

support packaging of out of source builds on macOS when using cmake.
note that Qt6 support for packaging still has many features in
preview, thus we still use our script based packaging.

move some Ubuntu CI jobs to jammy.  Unfortunately Qt6WebEngine is
unusable on jammy due to a bug in qt6-base.  So we are still using
Qt5 :(
https://bugs.launchpad.net/ubuntu/+source/qt6-base/+bug/1970057

* isolate qmake and cmake flows for windows.

add on on demand CI workflow for esoteric windows cases.

* use qt tools from cmake prefix, add gpsbabel translation support.

* fix coretool on windows.

add qt binary directory to environment so coretool can find the
Qt DLLs.

* catch coretool cmake up with #921.

* update packaging dependencies

15 files changed:
.github/workflows/macos.yml
.github/workflows/ubuntu.yml
.github/workflows/windows.yml
.github/workflows/windows_ondemand.yml [new file with mode: 0644]
gui/CMakeLists.txt
gui/app.pro
gui/coretool/CMakeLists.txt [new file with mode: 0644]
gui/coretool/coretool.cmake [new file with mode: 0644]
gui/package_app
gui/setup.iss.in
gui/setup.iss.qmake.in
tools/Dockerfile_jammy [new file with mode: 0644]
tools/ci_script_osx.sh [new file with mode: 0755]
tools/ci_script_windows.ps1 [new file with mode: 0755]
tools/make_windows_release.ps1

index 730b30e594b8049ba3c5de3542face08337656bc..0eeacb1945ec37896af84271cf11bddd16bf4e6f 100644 (file)
@@ -17,15 +17,18 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - QT_VERSION: '5.12.12'
-            XCODE_VERSION: '11.7'
-            RELEASE: false
           - QT_VERSION: '5.15.2'
             XCODE_VERSION: '12.4'
+            GENERATOR: qmake
             RELEASE: false
           - QT_VERSION: '6.2.4'
             XCODE_VERSION: '12.5.1'
+            GENERATOR: qmake
             RELEASE: true
+          - QT_VERSION: '6.2.4'
+            XCODE_VERSION: '12.5.1'
+            GENERATOR: 'Ninja'
+            RELEASE: false
 
     steps:
     - name: Checkout repository
@@ -51,11 +54,21 @@ jobs:
       run: |
         ./tools/travis_install_osx ${{ matrix.QT_VERSION }} aqt
 
+    - name: Brew install
+      if: matrix.GENERATOR == 'Ninja'
+      run: |
+        brew update
+        brew install ninja
+
     - name: Script
       run: |
         source ${HOME}/Cache/qt-${{ matrix.QT_VERSION }}.env
         sudo xcode-select --switch /Applications/Xcode_${{ matrix.XCODE_VERSION }}.app
-        ./tools/travis_script_osx
+        if [ "${{ matrix.GENERATOR }}" == qmake ]; then
+          ./tools/travis_script_osx
+        else
+          ./tools/ci_script_osx.sh . ${{ matrix.QT_VERSION }} ${{ matrix.GENERATOR }}
+        fi
 
     - name: Deploy
       # This only handles continous releases now, for other events artifacts may be saved in
index eac0f10bb3aa64339179db637b85e0393e48d871..055fbc0034d6d3015bba224b8baae1b943214a5a 100644 (file)
@@ -14,32 +14,36 @@ jobs:
     name: basic Build
     runs-on: ubuntu-latest
     container:
-      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_focal
+      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_jammy
       env:
         LC_ALL: 'C.UTF-8'
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: build_and_test
       run: |
+        # when using containers manually whitelist the checkout directory to allow git commands to work
+        git config --global --add safe.directory "${GITHUB_WORKSPACE}"
         ./tools/build_and_test.sh
 
   cmake:
     name: cmake Build
     runs-on: ubuntu-latest
     container:
-      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_focal
+      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_jammy
       env:
         LC_ALL: 'C.UTF-8'
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: build_and_test
       run: |
+        # when using containers manually whitelist the checkout directory to allow git commands to work
+        git config --global --add safe.directory "${GITHUB_WORKSPACE}"
         ./tools/build_and_test_cmake.sh
 
   qtio_gcc:
@@ -52,10 +56,12 @@ jobs:
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: build_and_test
       run: |
+        # when using containers manually whitelist the checkout directory to allow git commands to work
+        git config --global --add safe.directory "${GITHUB_WORKSPACE}"
         . /opt/qtio.env
         ./tools/build_and_test.sh
 
@@ -70,10 +76,12 @@ jobs:
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: build_and_test
       run: |
+        # when using containers manually whitelist the checkout directory to allow git commands to work
+        git config --global --add safe.directory "${GITHUB_WORKSPACE}"
         . /opt/qtio.env
         ./tools/build_and_test.sh
 
@@ -81,16 +89,18 @@ jobs:
     name: advanced Build
     runs-on: ubuntu-latest
     container:
-      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_focal
+      image: gpsbabel-docker.jfrog.io/tsteven4/gpsbabel_build_environment_jammy
       env:
         LC_ALL: 'C.UTF-8'
 
     steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: build_extra_tests
       run: |
+        # when using containers manually whitelist the checkout directory to allow git commands to work
+        git config --global --add safe.directory "${GITHUB_WORKSPACE}"
         ./tools/build_extra_tests.sh
 
   coverage:
@@ -103,7 +113,7 @@ jobs:
         sudo apt-get install gcovr lcov libusb-1.0-0-dev qt5-default
 
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
 
     - name: script
       env:
index 812dc425d968521cc93a93ba4b57b03e0b8f3a9d..8b5ea244259811d6f778dd0084e1b675d76122b4 100644 (file)
@@ -32,13 +32,6 @@ jobs:
             METHOD: 'aqt'
             FLOW: 'msbuild'
             RELEASE: false
-          - QT_VERSION: '5.12.12'
-            ARCH: 'amd64'
-            HOST_ARCH: 'x86'
-            COMPILER: 'msvc2017_64'
-            METHOD: 'aqt'
-            FLOW: 'cmake'
-            RELEASE: false
           - QT_VERSION: '5.12.12'
             ARCH: 'amd64'
             HOST_ARCH: 'x86'
@@ -61,6 +54,13 @@ jobs:
             METHOD: 'aqt'
             RELEASE: true
             FLOW: 'nmake'
+          - QT_VERSION: '6.2.4'
+            ARCH: 'amd64'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2019_64'
+            METHOD: 'aqt'
+            RELEASE: false
+            GENERATOR: 'Ninja'
 
     steps:
     - name: Checkout repository
@@ -85,27 +85,31 @@ jobs:
         CI_BUILD_DIR: ${{ github.workspace }}
       shell: bash
       run: |
-        ./tools/ci_install_windows.sh ${{ matrix.QT_VERSION }} ${{ matrix.COMPILER }} ${{ matrix.METHOD }}
+        ./tools/ci_install_windows.sh "${{ matrix.QT_VERSION }}" "${{ matrix.COMPILER }}" "${{ matrix.METHOD }}"
 
     - name: Build
       shell: powershell
       run: |
-        .\tools\ci_setup_windows.ps1 -qtdir "$Home\Cache\Qt\${{ matrix.QT_VERSION }}\${{ matrix.COMPILER }}" -arch ${{ matrix.ARCH }} -host_arch ${{ matrix.HOST_ARCH }} -vcversion "${{ matrix.VCVERSION }}"
-        .\tools\make_windows_release.ps1 -iscc "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" -buildinstaller true -flow ${{ matrix.FLOW }} -arch ${{ matrix.ARCH }}
+        .\tools\ci_setup_windows.ps1 -qtdir "$Home\Cache\Qt\${{ matrix.QT_VERSION }}\${{ matrix.COMPILER }}" -arch "${{ matrix.ARCH }}" -host_arch "${{ matrix.HOST_ARCH }}" -vcversion "${{ matrix.VCVERSION }}"
+        if ( "${{ matrix.generator }}" ) {
+          .\tools\ci_script_windows.ps1 -generator "${{ matrix.GENERATOR }}" -arch "${{ matrix.ARCH }}"
+        } else {
+          .\tools\make_windows_release.ps1 -iscc "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" -buildinstaller true -flow "${{ matrix.FLOW }}" -arch "${{ matrix.ARCH }}"
+        }
 
     - name: Rename
       shell: bash
       run: |
         VERSION_ID=$(date -u +%Y%m%dT%H%MZ --date=$(git show -s --format=%aI HEAD))-$(git rev-parse --short=7 HEAD)
-        mv gui/release/GPSBabel-*-Setup.exe gui/release/GPSBabel-${VERSION_ID}-Setup.exe
-        mv gui/release/GPSBabel-*-Manifest.txt gui/release/GPSBabel-${VERSION_ID}-Manifest.txt
+        mv bld/gui/GPSBabel-*-Setup.exe bld/gui/GPSBabel-${VERSION_ID}-Setup.exe
+        mv bld/gui/GPSBabel-*-Manifest.txt bld/gui/GPSBabel-${VERSION_ID}-Manifest.txt
 
     - name: Test
       shell: bash
       run: |
-        PATH="${HOME}/Cache/Qt/${{ matrix.QT_VERSION }}/${{ matrix.COMPILER }}/bin:${PATH}"
-        PNAME=./release/GPSBabel.exe GBTEMP=./gbtemp ./testo 2>&1
-        PNAME=./release/GPSBabel.exe GBTEMP=./gbtemp ./test_encoding_utf8 2>&1
+        PATH="${HOME}/Cache/Qt/${{ matrix.QT_VERSION }}/${{ matrix.COMPILER }}/bin:${PATH}"
+        PNAME=./bld/gui/package/gpsbabel.exe GBTEMP=./gbtemp ./testo 2>&1
+        PNAME=./bld/gui/package/gpsbabel.exe GBTEMP=./gbtemp ./test_encoding_utf8 2>&1
 
     - name: Deploy
       # This only handles continous releases now, for other events artifacts may be saved in
@@ -116,13 +120,13 @@ jobs:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         RELEASE_NAME: Continuous-${{ runner.os }}
       run: |
-        ./tools/uploadtool/upload_github.sh gui/release/GPSBabel-*-Setup.exe
+        ./tools/uploadtool/upload_github.sh bld/gui/GPSBabel-*-Setup.exe
 
     - name: 'Upload Artifacts'
       uses: actions/upload-artifact@v2
       with:
         name: Windows_Installer ${{ join(matrix.*) }}
         path: |
-          ./gui/release/GPSBabel-*-Setup.exe
-          ./gui/release/GPSBabel-*-Manifest.txt
+          ./bld/gui/GPSBabel-*-Setup.exe
+          ./bld/gui/GPSBabel-*-Manifest.txt
         retention-days: 7
diff --git a/.github/workflows/windows_ondemand.yml b/.github/workflows/windows_ondemand.yml
new file mode 100644 (file)
index 0000000..3e2fff2
--- /dev/null
@@ -0,0 +1,110 @@
+name: "windows ondemand"
+
+on:
+  schedule:
+    - cron: '27 4 * * 2'
+  workflow_dispatch: ~
+
+jobs:
+
+  windows:
+    name: windows ondemand Build
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - QT_VERSION: '5.12.12'
+            ARCH: 'amd64'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2017_64'
+            METHOD: 'aqt'
+            GENERATOR: 'Visual Studio 16 2019'
+            os: windows-2019
+          - QT_VERSION: '5.12.12'
+            ARCH: 'amd64'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2017_64'
+            TOOLSET: 'v141,version=14.16.27023'
+            METHOD: 'aqt'
+            GENERATOR: 'Visual Studio 16 2019'
+            os: windows-2019
+          - QT_VERSION: '5.12.12'
+            ARCH: 'x86'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2017'
+            METHOD: 'aqt'
+            GENERATOR: 'Visual Studio 16 2019'
+            os: windows-2019
+          - QT_VERSION: '6.2.4'
+            ARCH: 'amd64'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2019_64'
+            METHOD: 'aqt'
+            GENERATOR: 'Visual Studio 16 2019'
+            os: windows-2019
+          - QT_VERSION: '6.2.4'
+            ARCH: 'amd64'
+            HOST_ARCH: 'amd64'
+            COMPILER: 'msvc2019_64'
+            METHOD: 'aqt'
+            GENERATOR: 'Visual Studio 17 2022'
+            os: windows-latest
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v2
+
+    - name: Cache Qt
+      uses: actions/cache@v2
+      id: cache
+      with:
+        path: ~/Cache
+        key: ${{ runner.os }}-${{ matrix.QT_VERSION }}-${{ matrix.COMPILER }}-${{ secrets.CACHE_VERSION }}
+
+    - name: Install Qt setup(aqt)
+      if: steps.cache.outputs.cache-hit != 'true'
+      uses: actions/setup-python@v2
+      with:
+        python-version: '3.9'
+
+    - name: Install Qt
+      if: steps.cache.outputs.cache-hit != 'true'
+      env:
+        CI_BUILD_DIR: ${{ github.workspace }}
+      shell: bash
+      run: |
+        ./tools/ci_install_windows.sh "${{ matrix.QT_VERSION }}" "${{ matrix.COMPILER }}" "${{ matrix.METHOD }}"
+
+    - name: Build
+      shell: powershell
+      run: |
+        .\tools\ci_setup_windows.ps1 -qtdir "$Home\Cache\Qt\${{ matrix.QT_VERSION }}\${{ matrix.COMPILER }}" -arch "${{ matrix.ARCH }}" -host_arch "${{ matrix.HOST_ARCH }}" -vcversion "${{ matrix.VCVERSION }}"
+        if ( "${{ matrix.generator }}" ) {
+          .\tools\ci_script_windows.ps1 -generator "${{ matrix.GENERATOR }}" -arch "${{ matrix.ARCH }}" -toolset "${{ matrix.TOOLSET }}"
+        } else {
+          .\tools\make_windows_release.ps1 -iscc "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" -buildinstaller true -flow "${{ matrix.FLOW }}" -arch "${{ matrix.ARCH }}"
+        }
+
+    - name: Rename
+      shell: bash
+      run: |
+        VERSION_ID=$(date -u +%Y%m%dT%H%MZ --date=$(git show -s --format=%aI HEAD))-$(git rev-parse --short=7 HEAD)
+        mv bld/gui/GPSBabel-*-Setup.exe bld/gui/GPSBabel-${VERSION_ID}-Setup.exe
+        mv bld/gui/GPSBabel-*-Manifest.txt bld/gui/GPSBabel-${VERSION_ID}-Manifest.txt
+
+    - name: Test
+      shell: bash
+      run: |
+        # PATH="${HOME}/Cache/Qt/${{ matrix.QT_VERSION }}/${{ matrix.COMPILER }}/bin:${PATH}"
+        PNAME=./bld/gui/package/gpsbabel.exe GBTEMP=./gbtemp ./testo 2>&1
+        PNAME=./bld/gui/package/gpsbabel.exe GBTEMP=./gbtemp ./test_encoding_utf8 2>&1
+
+    - name: 'Upload Artifacts'
+      uses: actions/upload-artifact@v2
+      with:
+        name: Windows_Installer ${{ join(matrix.*) }}
+        path: |
+          ./bld/gui/GPSBabel-*-Setup.exe
+          ./bld/gui/GPSBabel-*-Manifest.txt
+        retention-days: 7
index 4c839c23a25fc89d2840eb1c63b99616beb64346..be0d6d56dc76eeda223d98e5cf6aaf3302493ddb 100644 (file)
@@ -2,6 +2,8 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
   message(FATAL_ERROR "Please use CMakeLists.txt in the project root directory to generate a build system.")
 endif()
 
+add_subdirectory(coretool)
+
 configure_file(${CMAKE_SOURCE_DIR}/gbversion.h.in gbversion.h @ONLY NEWLINE_STYLE LF)
 configure_file(setup.iss.in setup.iss @ONLY NEWLINE_STYLE CRLF)
 
@@ -170,4 +172,78 @@ message(STATUS "Libs are: \"${LnkLibs}\"")
 get_target_property(IncDirs ${TARGET} INCLUDE_DIRECTORIES)
 message(STATUS "Include Directores are: \"${IncDirs}\"")
 
-add_custom_target(package_app COMMAND ./package_app DEPENDS ${TARGET})
+# FIXME: remove reliance an app.pro in package_app script.
+# FIXME: translations updated and released in source directory (and under version control).
+list(APPEND TRANSLATIONS gpsbabelfe_de.ts)
+list(APPEND TRANSLATIONS gpsbabelfe_es.ts)
+list(APPEND TRANSLATIONS gpsbabelfe_fr.ts)
+list(APPEND TRANSLATIONS gpsbabelfe_hu.ts)
+list(APPEND TRANSLATIONS gpsbabelfe_it.ts)
+list(APPEND TRANSLATIONS gpsbabelfe_ru.ts)
+
+if(APPLE)
+  get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION)
+  add_custom_target(package_app
+                    COMMAND QMAKE=${_qmake_executable} ${CMAKE_CURRENT_SOURCE_DIR}/package_app $<TARGET_BUNDLE_DIR:${TARGET}> $<TARGET_FILE:gpsbabel> ${CMAKE_CURRENT_SOURCE_DIR}
+                    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_BUNDLE_DIR:${TARGET}>/../GPSBabelFE.dmg ${CMAKE_CURRENT_BINARY_DIR}
+                    DEPENDS ${TARGET} gpsbabel coretool_lrelease
+                    VERBATIM
+                    USES_TERMINAL)
+elseif(UNIX)
+  get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION)
+  add_custom_target(package_app
+                    COMMAND QMAKE=${_qmake_executable} ${CMAKE_CURRENT_SOURCE_DIR}/package_app $<TARGET_FILE_DIR:${TARGET}> $<TARGET_FILE:gpsbabel> ${CMAKE_CURRENT_SOURCE_DIR}
+                    DEPENDS ${TARGET} gpsbabel coretool_lrelease
+                    VERBATIM
+                    USES_TERMINAL)
+elseif(WIN32)
+  find_package(Qt${QT_VERSION_MAJOR} QUIET COMPONENTS LinguistTools)
+  if (NOT Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
+    message(WARNING "Qt${QT_VERSION_MAJOR}LinguistTools not found, ${TARGET} translations cannot be updated or released, and application cannot be packaged.")
+  endif()
+
+  find_program(INNO_COMPILER NAMES iscc ISCC
+               PATHS "C:/Program Files (x86)/Inno Setup 6" "C:/Program Files/Inno Setup 6")
+  if (INNO_COMPILER STREQUAL "INNO_COMPILER-NOTFOUND")
+    message(WARNING "Inno compiler iscc not found, application cannot be packaged.")
+  endif()
+
+  # in 5.12.12 cmake doesn't know about windeployqt, look in directory that has qmake.
+  get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION)
+  get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
+  find_program(WINDEPLOYQT NAMES windeployqt PATHS "${_qt_bin_dir}" NO_DEFAULT_PATH)
+  if (WINDEPLOYQT STREQUAL "WINDEPLOYQT-NOTFOUND")
+    message(WARNING "windeployqt not found, application cannot be packaged.")
+  endif()
+
+  if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
+    add_custom_target(${TARGET}_lupdate
+                      COMMAND Qt${QT_VERSION_MAJOR}::lupdate ${SOURCES} ${FORMS} -ts ${TRANSLATIONS}
+                      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                      VERBATIM
+                      USES_TERMINAL)
+    add_custom_target(${TARGET}_lrelease
+                      COMMAND Qt${QT_VERSION_MAJOR}::lrelease ${TRANSLATIONS}
+                      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                      DEPENDS ${TARGET}_lupdate
+                      VERBATIM
+                      USES_TERMINAL)
+    if((NOT WINDEPLOYQT STREQUAL "WINDEPLOYQT-NOTFOUND") AND (NOT INNO_COMPILER STREQUAL "INNO_COMPILER-NOTFOUND"))
+      file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}" _win_binary_path)
+      file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" _win_source_path)
+      add_custom_target(package_app
+                        # deploy to a clean directory as different build systems create differently named debris in release.
+                        COMMAND ${CMAKE_COMMAND} -E remove_directory package
+                        COMMAND ${CMAKE_COMMAND} -E make_directory package
+                        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${TARGET}> package
+                        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gpsbabel> package
+                        # use --plugindir option to locate the plugins.
+                        COMMAND ${WINDEPLOYQT} --verbose 1 --plugindir package\\plugins package\\GPSBabelFE.exe package\\GPSBabel.exe
+                        # set location to location of generated setup.iss file.
+                        COMMAND ${INNO_COMPILER} /Doutput_dir=${_win_binary_path} /Dsource_dir=${_win_source_path} setup.iss
+                        DEPENDS ${TARGET} gpsbabel ${TARGET}_lrelease coretool_lrelease
+                        VERBATIM
+                        USES_TERMINAL)
+    endif()
+  endif()
+endif()
index 81385bf5bc200971fa6b5fc8a6e50d27aa0fd494..a4ea0dfab9e614505067e3e7d2b996b451ede63e 100755 (executable)
@@ -35,6 +35,7 @@ unix:DESTDIR = objects
 unix:MOC_DIR = objects
 unix:OBJECTS_DIR = objects
 unix:RCC_DIR = objects
+unix:!mac:DESTDIR = GPSBabelFE
 mac:DESTDIR = .
 
 UI_DIR = tmp
diff --git a/gui/coretool/CMakeLists.txt b/gui/coretool/CMakeLists.txt
new file mode 100644 (file)
index 0000000..51092b8
--- /dev/null
@@ -0,0 +1,66 @@
+if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
+  message(FATAL_ERROR "Please use CMakeLists.txt in the project root directory to generate a build system.")
+endif()
+
+set(TARGET coretool)
+
+add_executable(${TARGET} EXCLUDE_FROM_ALL)
+
+find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
+find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets REQUIRED)
+list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Widgets)
+
+list(APPEND SOURCES ../formatload.cc)
+list(APPEND SOURCES coretool.cc)
+
+list(APPEND HEADERS ../format.h)
+list(APPEND HEADERS ../formatload.h)
+
+target_compile_definitions(${TARGET} PRIVATE GENERATE_CORE_STRINGS)
+target_include_directories(${TARGET} PRIVATE ..)
+target_sources(${TARGET} PRIVATE ${SOURCES} ${HEADERS})
+target_link_libraries(${TARGET} ${QT_LIBRARIES})
+
+# FIXME: core_strings.h generated in source directory (and under version control).
+# FIXME: translations updated and released in source directory (and under version control).
+
+get_target_property(_qmake_executable Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION)
+get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
+add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/core_strings.h
+                  COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:gpsbabel> ${CMAKE_CURRENT_BINARY_DIR}
+                  COMMAND ${CMAKE_COMMAND} -DQTBINDIR=${_qt_bin_dir} -DCURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/coretool.cmake
+                  DEPENDS ${TARGET} gpsbabel
+                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                  VERBATIM
+                  USES_TERMINAL)
+
+list(APPEND TRANSLATIONS gpsbabel_de.ts)
+list(APPEND TRANSLATIONS gpsbabel_es.ts)
+list(APPEND TRANSLATIONS gpsbabel_fr.ts)
+list(APPEND TRANSLATIONS gpsbabel_hu.ts)
+list(APPEND TRANSLATIONS gpsbabel_it.ts)
+list(APPEND TRANSLATIONS gpsbabel_ru.ts)
+
+find_package(Qt${QT_VERSION_MAJOR} QUIET COMPONENTS LinguistTools)
+if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
+  # The line numbers are almost meaningless the way we generate corestrings.h, and we force everything to the same context.
+  # With line numbers and the similartext heuristic enabled translations can be copied from an old message to a new message,
+  # and marked as unfinished.  The threshold for similar is low.
+  # These will be used by the application, even though they really need to be checked.
+  # Disable the similartext heuristic to avoid these mistranslations.
+  add_custom_target(coretool_lupdate
+                    COMMAND Qt${QT_VERSION_MAJOR}::lupdate -disable-heuristic similartext core_strings.h -ts ${TRANSLATIONS}
+                    DEPENDS core_strings.h
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                    VERBATIM
+                    USES_TERMINAL)
+  
+  add_custom_target(coretool_lrelease
+                    COMMAND Qt${QT_VERSION_MAJOR}::lrelease ${TRANSLATIONS}
+                    DEPENDS coretool_lupdate
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                    VERBATIM
+                    USES_TERMINAL)
+else()
+  message(WARNING "Qt${QT_VERSION_MAJOR}LinguistTools not found, coretool translations cannot be updated or released.")
+endif()
diff --git a/gui/coretool/coretool.cmake b/gui/coretool/coretool.cmake
new file mode 100644 (file)
index 0000000..0c87596
--- /dev/null
@@ -0,0 +1,13 @@
+foreach(var QTBINDIR CURRENT_BINARY_DIR)
+  if(NOT DEFINED ${var})
+    message(FATAL_ERROR "${var} must be passed on the command line")
+  endif()
+endforeach()
+
+if(WIN32)
+  # windows needs the Qt Binary directory in the path to find the DLLs.
+  file(TO_NATIVE_PATH "${QTBINDIR}" _qt_win_path)
+  set(ENV{PATH} "${_qt_win_path};$ENV{PATH}")
+endif()
+execute_process(
+  COMMAND ${CURRENT_BINARY_DIR}/coretool core_strings.h)
index 01c00eb4988640fa5c18d15f656517af018b1369..a4d93ce073e307961a247bce27c9b9e5af046ea3 100755 (executable)
@@ -74,6 +74,9 @@ LRELEASE="$(${QMAKE} -query QT_INSTALL_BINS)/lrelease"
 LCONVERT="$(${QMAKE} -query QT_INSTALL_BINS)/lconvert"
 MACDEPLOYQT="$(${QMAKE} -query QT_INSTALL_BINS)/macdeployqt"
 
+GPSBABEL=${2:-../gpsbabel}
+SOURCEDIR=${3:-.}
+
 case "$(uname -s)" in
   Linux*)     machine=Linux;;
   Darwin*)    machine=Mac;;
@@ -81,41 +84,42 @@ case "$(uname -s)" in
 esac
 
 # update our translations and compile them.
-"${LUPDATE}" app.pro
-"${LRELEASE}" app.pro
+"${LUPDATE}" "${SOURCEDIR}/app.pro"
+"${LRELEASE}" "${SOURCEDIR}/app.pro"
 
 if [ "${machine}" = "Linux" ]; then
   # need absolute paths for convert_qt_translations()
-  APPDIR="$(pwd)/GPSBabelFE"
+  APPDIR="$( cd "${1:-GPSBabelFE}" && pwd )"
   LANGDIR="${APPDIR}/translations"
 else
-  APPBUNDLE=GPSBabelFE.app
   # need absolute paths for convert_qt_translations()
-  APPDIR="$(pwd)/${APPBUNDLE}"
+  APPDIR="$( cd "${1:-GPSBabelFE.app}" && pwd )"
   LANGDIR="${APPDIR}/Contents/MacOS/translations"
+  APPBUNDLE=$(basename "$APPDIR")
 fi
 
 rm -fr "${LANGDIR}"
 mkdir -p "${LANGDIR}"
 
 # copy our compiled translations.
-cp gpsbabelfe_??.qm "${LANGDIR}"
-cp coretool/gpsbabel_??.qm "${LANGDIR}"
+cp "${SOURCEDIR}"/gpsbabelfe_??.qm "${LANGDIR}"
+cp "${SOURCEDIR}"/coretool/gpsbabel_??.qm "${LANGDIR}"
 
 # bundle Qt .qm files, deploy them with our .qm files,
 # and, for macos, make & deploy locversion.plist files.
 (convert_qt_translations)
 
 if [ "${machine}" = "Linux" ]; then
-  cp objects/gpsbabelfe "${APPDIR}"
-  cp ../gpsbabel "${APPDIR}"
-  cp gmapbase.html "${APPDIR}"
-  cp COPYING.txt "${APPDIR}"
+  cp "${GPSBABEL}" "${APPDIR}"
+  cp "${SOURCEDIR}/gmapbase.html" "${APPDIR}"
+  cp "${SOURCEDIR}/COPYING.txt" "${APPDIR}"
 else # Mac
-  cp ../gpsbabel "${APPDIR}/Contents/MacOS/gpsbabel"
-  cp gmapbase.html "${APPDIR}/Contents/MacOS"
-  cp COPYING.txt "${APPDIR}/Contents/MacOS"
+  cp "${GPSBABEL}" "${APPDIR}/Contents/MacOS/gpsbabel"
+  cp "${SOURCEDIR}/gmapbase.html" "${APPDIR}/Contents/MacOS"
+  cp "${SOURCEDIR}/COPYING.txt" "${APPDIR}/Contents/MacOS"
+  pushd "${APPDIR}/.."
   rm -f GPSBabelFE.dmg
   # macdeploytqt likes relative paths or else the dmg mount points get funky.
   "${MACDEPLOYQT}" "${APPBUNDLE}" -executable="${APPBUNDLE}/Contents/MacOS/gpsbabel" -dmg -verbose=2
+  popd
 fi
index 6074353ba599fda0f3620e72aa2a7e6ada39a134..31dbbf565666e70d2b5661316f1dbc77d9e0f55d 100644 (file)
@@ -7,8 +7,8 @@
 ; Uses the Inno setup compiler.\r
 ; windeployqt should be run to prepare the necessary Qt files before\r
 ; running Inno Setup.\r
-#ifndef package_dir\r
-  #define package_dir "..\build-app-Desktop-Release\package"\r
+#ifndef output_dir\r
+  #define output_dir "."\r
 #endif\r
 #ifndef source_dir\r
   #define source_dir "."\r
@@ -29,7 +29,7 @@ ArchitecturesAllowed=x64
 ArchitecturesInstallIn64BitMode=x64\r
 DefaultDirName={pf}\GPSBabel\r
 DefaultGroupName=GPSBabel\r
-OutputDir=release\r
+OutputDir="{#output_dir}"\r
 OutputBaseFilename=GPSBabel-@GB.VERSION@@GB.PACKAGE_RELEASE@-Setup\r
 OutputManifestFile=GPSBabel-@GB.VERSION@@GB.PACKAGE_RELEASE@-Manifest.txt\r
 SetupIconFile=images\babel2.ico\r
@@ -48,10 +48,10 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
 Source: gmapbase.html;                         DestDir: "{app}"; Flags: ignoreversion\r
 Source: qt.conf;                               DestDir: "{app}"; Flags: ignoreversion\r
 \r
-Source: "{#package_dir}\*"; Excludes: "vc_redist.*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs\r
-Source: "{#package_dir}\vc_redist.x86.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
-Source: "{#package_dir}\vc_redist.x64.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
-Source: "{#package_dir}\gpsbabel.exe";         DestDir: "{app}"; Flags: ignoreversion\r
+Source: "{#output_dir}\package\*"; Excludes: "vc_redist.*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs\r
+Source: "{#output_dir}\package\vc_redist.x86.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
+Source: "{#output_dir}\package\vc_redist.x64.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
+Source: "{#output_dir}\package\gpsbabel.exe";          DestDir: "{app}"; Flags: ignoreversion\r
 ; Source: release\help\*;              DestDir: "{app}\help"; Flags: ignoreversion recursesubdirs createallsubdirs\r
 \r
 ; Translation strings extracted from source code.  Include it in the dist\r
index 81c2b78c08b5c762f87f816de4e0b77f296a3c58..62b8ae879fd443d588ff3c4b7c7667d9ce8fd64b 100644 (file)
@@ -7,11 +7,11 @@
 ; Uses the Inno setup compiler.\r
 ; windeployqt should be run to prepare the necessary Qt files before\r
 ; running Inno Setup.\r
-#ifndef package_dir\r
-  #define package_dir \"..\\build-app-Desktop-Release\\package\"\r
+#ifndef output_dir\r
+  #define output_dir \".\"\r
 #endif\r
 #ifndef source_dir\r
-  #define source_dir "."\r
+  #define source_dir \".\"\r
 #endif\r
 \r
 [Setup]\r
@@ -29,7 +29,7 @@ ArchitecturesAllowed=x64
 ArchitecturesInstallIn64BitMode=x64\r
 DefaultDirName={pf}\\GPSBabel\r
 DefaultGroupName=GPSBabel\r
-OutputDir=release\r
+OutputDir=\"{#output_dir}\"\r
 OutputBaseFilename=GPSBabel-$${GB.VERSION}$${GB.PACKAGE_RELEASE}-Setup\r
 OutputManifestFile=GPSBabel-$${GB.VERSION}$${GB.PACKAGE_RELEASE}-Manifest.txt\r
 SetupIconFile=images\\babel2.ico\r
@@ -48,10 +48,10 @@ Name: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription
 Source: gmapbase.html;                         DestDir: \"{app}\"; Flags: ignoreversion\r
 Source: qt.conf;                               DestDir: \"{app}\"; Flags: ignoreversion\r
 \r
-Source: \"{#package_dir}\\*\"; Excludes: \"vc_redist.*.exe\"; DestDir: \"{app}\"; Flags: ignoreversion recursesubdirs createallsubdirs\r
-Source: \"{#package_dir}\\vc_redist.x86.exe\"; DestDir: \"{app}\"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
-Source: \"{#package_dir}\\vc_redist.x64.exe\"; DestDir: \"{app}\"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
-Source: \"{#package_dir}\\gpsbabel.exe\";      DestDir: \"{app}\"; Flags: ignoreversion\r
+Source: \"{#output_dir}\\package\\*\"; Excludes: \"vc_redist.*.exe\"; DestDir: \"{app}\"; Flags: ignoreversion recursesubdirs createallsubdirs\r
+Source: \"{#output_dir}\\package\\vc_redist.x86.exe\"; DestDir: \"{app}\"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
+Source: \"{#output_dir}\\package\\vc_redist.x64.exe\"; DestDir: \"{app}\"; Flags: ignoreversion skipifsourcedoesntexist deleteafterinstall\r
+Source: \"{#output_dir}\\package\\gpsbabel.exe\";      DestDir: \"{app}\"; Flags: ignoreversion\r
 ; Source: release\\help\\*;            DestDir: \"{app}\\help\"; Flags: ignoreversion recursesubdirs createallsubdirs\r
 \r
 ; Translation strings extracted from source code.  Include it in the dist\r
diff --git a/tools/Dockerfile_jammy b/tools/Dockerfile_jammy
new file mode 100644 (file)
index 0000000..54d50ff
--- /dev/null
@@ -0,0 +1,74 @@
+# this file is used to build the image gpsbabel_build_environment used by travis.
+
+FROM ubuntu:jammy
+
+LABEL maintainer="https://github.com/tsteven4"
+
+WORKDIR /app
+
+# update environment.
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    apt-utils \
+ && apt-get upgrade -y \
+ && rm -rf /var/lib/apt/lists/*
+
+# install packages needed for gpsbabel build
+# split into multiple commands to limit layer size
+
+# basic build and test tools
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    g++ \
+    make \
+    autoconf \
+    git \
+    valgrind \
+    expat \
+    libxml2-utils \
+    bear \
+    cmake \
+    ninja-build \
+    clazy \
+ && rm -rf /var/lib/apt/lists/*
+
+# alternative compiler
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    clang \
+ && rm -rf /var/lib/apt/lists/*
+
+# pkgs needed to build document
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    fop \
+    xsltproc \
+    docbook-xml \
+    docbook-xsl \
+ && rm -rf /var/lib/apt/lists/*
+
+# pkgs with libraries needed by gpsbabel
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    libusb-1.0-0-dev \
+    pkg-config \
+    libudev-dev \
+ && rm -rf /var/lib/apt/lists/*
+
+# pkgs with qt used by gpsbabel
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    qtbase5-dev \
+    qttools5-dev-tools \
+    qttranslations5-l10n \
+    qtwebengine5-dev \
+    libqt5serialport5-dev \
+ && rm -rf /var/lib/apt/lists/*
+
+# pkgs needed to generate coverage report:
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    gcovr \
+ && rm -rf /var/lib/apt/lists/*
+
+# install environment for locale test
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    locales \
+ && rm -rf /var/lib/apt/lists/* \
+ && sed -i 's/^# *\(en_US ISO-8859-1\)/\1/' /etc/locale.gen \
+ && locale-gen \
+ && locale -a
diff --git a/tools/ci_script_osx.sh b/tools/ci_script_osx.sh
new file mode 100755 (executable)
index 0000000..e6ca180
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/bash -ex
+#
+# this script is run on ci for the script stage of mac builds
+#
+function version_ge() { test "$(printf "%s\n%s" $1 $2 | sort -rV | head -n 1)" == "$1"; }
+
+if [ $# -lt 2 ]; then
+  echo "Usage: $0 source_directory qt_version [Generator]"
+  exit 1
+fi
+SOURCE_DIR=$1
+QTVER=$2
+if [ $# -ge 3 ]; then
+  if [ -n "$3" ]; then
+    GENERATOR[0]=-G
+    GENERATOR[1]=$3
+  fi
+fi
+if version_ge "${QTVER}" 6.0.0; then
+  DEPLOY_TARGET="10.14"
+  ARCHS="x86_64;arm64"
+elif version_ge "${QTVER}" 5.14.0; then
+  DEPLOY_TARGET="10.13"
+  ARCHS="x86_64"
+else
+  DEPLOY_TARGET="10.12"
+  ARCHS="x86_64"
+fi
+  
+# we assume we are on macOS, so date is not gnu date.
+VERSIONID=${VERSIONID:-$(date -ju -f %Y-%m-%dT%H:%M:%S%z $(git show -s --format="%aI" HEAD | sed 's/:\(..\)$/\1/') +%Y%m%dT%H%MZ)-$(git rev-parse --short=7 HEAD)}
+
+# debug tokens
+"$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd)"/ci_tokens
+
+case "${GENERATOR[1]}" in
+Xcode | "Ninja Multi-Config")
+  cmake "${SOURCE_DIR}" -DCMAKE_OSX_ARCHITECTURES=${ARCHS} -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOY_TARGET} "${GENERATOR[@]}"
+  cmake --build . --config Release
+  ctest -C Release
+  cmake --build . --config Release --target package_app
+  ;;
+*)
+  cmake "${SOURCE_DIR}" -DCMAKE_OSX_ARCHITECTURES=${ARCHS} -DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOY_TARGET} -DCMAKE_BUILD_TYPE=Release "${GENERATOR[@]}"
+  cmake --build .
+  ctest
+  cmake --build . --target package_app
+  ;;
+esac
+
+# what is in there?
+hdiutil attach -noverify gui/GPSBabelFE.dmg
+find /Volumes/GPSBabelFE -ls
+hdiutil detach /Volumes/GPSBabelFE
+
+mv gui/GPSBabelFE.dmg "gui/GPSBabel-${VERSIONID}.dmg"
diff --git a/tools/ci_script_windows.ps1 b/tools/ci_script_windows.ps1
new file mode 100755 (executable)
index 0000000..5e2d493
--- /dev/null
@@ -0,0 +1,63 @@
+# Script to build and create windows installer.\r
+#\r
+# Run this from a Qt Desktop command window that has the Qt and mingw compiler paths set up,\r
+# such as the one Qt Creator will put on the start menu, or\r
+# from a power shell prompt after settings up the paths with tools\ci_setup_windows.ps1.\r
+# For example\r
+# powershell.exe -ExecutionPolicy Unrestricted -File tools\make_windows_release.ps1\r
+#\r
+# The defaults should be compatible with github action builds.\r
+Param(\r
+    $build_dir_name = "bld",\r
+    $generator = "Ninja",\r
+    $toolset = "",\r
+    [ValidateSet("x86", "amd64", "amd64_x86", "x86_amd64")] $arch = "amd64"\r
+)\r
+# the arch parameter values correspond to:\r
+# vcvarsall arch parameter x86 => host x86, target x86.\r
+# vcvarsall arch paramter amd64 => host amd64, target amd64.\r
+# vcvarsall arch parameter amd64_x86 => host amd64, target x86\r
+# vcvarsall arch parameter x86_amd64 => host x86, target amd64\r
+# vsdevcmd arch parameter x86 => target x86.\r
+# vsdevcmd arch parameter amd64 => target amd64.\r
+\r
+$ErrorActionPreference = "Stop"\r
+# verify we are in the top of the gpsbabel clone\r
+Get-Item tools/ci_script_windows.ps1 -ErrorAction Stop | Out-Null\r
+$src_dir = $Pwd\r
+$build_dir = Join-Path $src_dir $build_dir_name\r
+$CMAKE_PREFIX_PATH = Split-Path $((Get-Command qmake) | Split-Path) -Parent\r
+# translate target architecture to Platform property value.\r
+switch ($arch) {\r
+    "x86" { $platform = "Win32" }\r
+    "amd64" { $platform = "x64" }\r
+    "amd64_x86" { $platform = "Win32" }\r
+    "x86_amd64" { $platform = "x64" }\r
+}\r
+# make sure we are staring with a clean build directory\r
+Remove-Item $build_dir -Recurse -ErrorAction Ignore\r
+New-Item $build_dir -type directory -Force | Out-Null\r
+Set-Location $build_dir\r
+$hashargs = "-G", $generator\r
+if ( $toolset ) {\r
+  $hashargs += "-T", $toolset\r
+}\r
+if ( $generator -like "Visual Studio*") {\r
+  $hashargs += "-A", $platform\r
+} else {\r
+  $hashargs += "-DCMAKE_BUILD_TYPE:STRING=Release"\r
+}\r
+$hashargs += "-DCMAKE_PREFIX_PATH:PATH=$CMAKE_PREFIX_PATH"\r
+Write-Output cmake $hashargs $src_dir\r
+cmake $hashargs $src_dir\r
+if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
+switch -wildcard ($generator) {\r
+    "Visual Studio*" { cmake --build $build_dir --config Release }\r
+    default { cmake --build $build_dir }\r
+}\r
+if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
+switch -wildcard ($generator) {\r
+    "Visual Studio*" { cmake --build $build_dir --config Release --target package_app }\r
+    default { cmake --build $build_dir --target package_app}\r
+}\r
+if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
index 50ed936b9528161c7a5412af2eda29d0f70722e9..18bcc6766ab45344b173aa29526cb9b54d4033a9 100755 (executable)
@@ -13,9 +13,8 @@
 Param(\r
     $windeployqt = "windeployqt.exe",\r
     $iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe",\r
-    $gpsbabel_build_dir_name = "build-GPSBabel-Desktop-Release",\r
-    $gui_build_dir_name = "build-app-Desktop-Release",\r
-    [ValidateSet("mingw", "msbuild", "nmake", "cmake")] $flow = "nmake",\r
+    $gpsbabel_build_dir_name = "bld",\r
+    [ValidateSet("mingw", "msbuild", "nmake")] $flow = "nmake",\r
     $buildinstaller = "false",\r
     [ValidateSet("x86", "amd64", "amd64_x86", "x86_amd64")] $arch = "amd64"\r
 )\r
@@ -30,12 +29,8 @@ $ErrorActionPreference = "Stop"
 # verify we are in the top of the gpsbabel clone\r
 Get-Item tools/make_windows_release.ps1 -ErrorAction Stop | Out-Null\r
 $gpsbabel_src_dir = "$Pwd"\r
-$gpsbabel_build_dir = "$($gpsbabel_src_dir)\..\$($gpsbabel_build_dir_name)"\r
-if ( "$flow" -eq "cmake" ) {\r
-  $gui_build_dir = "$($gpsbabel_build_dir)"\r
-} else {\r
-  $gui_build_dir = "$($gpsbabel_src_dir)\$($gui_build_dir_name)"\r
-}\r
+$gpsbabel_build_dir = "$($gpsbabel_src_dir)\$($gpsbabel_build_dir_name)"\r
+$gui_build_dir = "$($gpsbabel_build_dir)\gui"\r
 if ( "$flow" -eq "msbuild" ) {\r
     # translate target architecture to Platform property value.\r
     switch ($arch) {\r
@@ -45,9 +40,6 @@ if ( "$flow" -eq "msbuild" ) {
         "x86_amd64" { $platform = "x64" }\r
     }\r
 }\r
-if ( "$flow" -eq "cmake" ) {\r
-    $CMAKE_PREFIX_PATH = "$(Join-Path "$((Get-Command qmake) | Split-Path)"  '..' -Resolve)"\r
-}\r
 # mimic creator shadow build to match Inno setup file\r
 # make sure we are staring with a clean build directory\r
 Remove-Item "$($gpsbabel_build_dir)" -Recurse -ErrorAction Ignore\r
@@ -62,39 +54,30 @@ switch ($flow) {
     #WARNING: Could not parse Compiler option '-std:c++14'; added to AdditionalOptions.\r
     "msbuild" { $ErrorActionPreference = "Continue"; qmake -tp vc "$($gpsbabel_src_dir)\GPSBabel.pro"; $ErrorActionPreference = "Stop" }\r
     "nmake" { qmake "$($gpsbabel_src_dir)\GPSBabel.pro" -spec "win32-msvc" }\r
-    "cmake" { cmake -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Release" -DCMAKE_PREFIX_PATH:PATH="$($CMAKE_PREFIX_PATH)" -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH="$($gpsbabel_build_dir)\release" "$($gpsbabel_src_dir)" }\r
 }\r
 if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
 switch ($flow) {\r
     "mingw" { ming32-make }\r
     "msbuild" { msbuild GPSBabel.vcxproj -property:Configuration=Release -property:Platform=$platform }\r
     "nmake" { nmake /NOLOGO }\r
-    "cmake" { cmake --build . }\r
 }\r
 if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
-# copy GPSBabel.exe for use by test_script\r
-Remove-Item "$($gpsbabel_src_dir)\release" -Recurse -ErrorAction Ignore\r
-New-Item "$($gpsbabel_src_dir)\release" -type directory -Force | Out-Null\r
-Copy-Item "$($gpsbabel_build_dir)\release\GPSBabel.exe" "$($gpsbabel_src_dir)\release\GPSBabel.exe"\r
-if ( "$flow" -ne "cmake" ) {\r
-    Set-Location "$($gpsbabel_src_dir)"\r
-    # make sure we are staring with a clean build directory\r
-    Remove-Item "$($gui_build_dir)" -Recurse -ErrorAction Ignore\r
-    New-Item "$($gui_build_dir)" -type directory -Force | Out-Null\r
-    Set-Location "$($gui_build_dir)"\r
-    switch ($flow) {\r
-        "mingw" { qmake "$($gpsbabel_src_dir)\gui\app.pro" -spec "win32-g++" }\r
-        "msbuild" { qmake -tp vc "$($gpsbabel_src_dir)\gui\app.pro" }\r
-        "nmake" { qmake "$($gpsbabel_src_dir)\gui\app.pro" -spec "win32-msvc" }\r
-    }\r
-    if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
-    switch ($flow) {\r
-        "mingw" { ming32-make }\r
-        "msbuild" { msbuild GPSBabelFE.vcxproj -property:Configuration=Release -property:Platform=$platform }\r
-        "nmake" { nmake /NOLOGO }\r
-    }\r
-    if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
+# make sure we are staring with a clean build directory\r
+Remove-Item "$($gui_build_dir)" -Recurse -ErrorAction Ignore\r
+New-Item "$($gui_build_dir)" -type directory -Force | Out-Null\r
+Set-Location "$($gui_build_dir)"\r
+switch ($flow) {\r
+    "mingw" { qmake "$($gpsbabel_src_dir)\gui\app.pro" -spec "win32-g++" }\r
+    "msbuild" { qmake -tp vc "$($gpsbabel_src_dir)\gui\app.pro" }\r
+    "nmake" { qmake "$($gpsbabel_src_dir)\gui\app.pro" -spec "win32-msvc" }\r
+}\r
+if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
+switch ($flow) {\r
+    "mingw" { ming32-make }\r
+    "msbuild" { msbuild GPSBabelFE.vcxproj -property:Configuration=Release -property:Platform=$platform }\r
+    "nmake" { nmake /NOLOGO }\r
 }\r
+if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
 Set-Location "$($gui_build_dir)"\r
 # work around errors with lupdate, lrelease misprocessing qtHaveModule(webenginewidgets)\r
 # and generating a message to stderr WARNING: Project ERROR: Unknown module(s) in QT: webkit webkitwidgets\r
@@ -107,17 +90,14 @@ $ErrorActionPreference = "Stop"
 # deploy to a clean directory as different build systems create differently named debris in release.\r
 Remove-Item "$($gui_build_dir)\package" -Recurse -ErrorAction Ignore\r
 New-Item "$($gui_build_dir)\package" -type directory -Force | Out-Null\r
-Copy-Item "$($gpsbabel_build_dir)\release\GPSBabel.exe" "$($gui_build_dir)\package\GPSBabel.exe"\r
+Copy-Item "$($gpsbabel_build_dir)\release\gpsbabel.exe" "$($gui_build_dir)\package\gpsbabel.exe"\r
 Copy-Item "$($gui_build_dir)\release\GPSBabelFE.exe" "$($gui_build_dir)\package\GPSBabelFE.exe"\r
 # use --plugindir option to locate the plugins.\r
-& "$($windeployqt)" --verbose 1 --plugindir package\plugins package\GPSBabelFE.exe package\GPSBabel.exe\r
+& "$($windeployqt)" --verbose 1 --plugindir package\plugins package\GPSBabelFE.exe package\gpsbabel.exe\r
 if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
 if ($buildinstaller -eq "true") {\r
     # set location to location of generated setup.iss file.\r
-    if ( "$flow" -eq "cmake" ) {\r
-        Set-Location "$($gpsbabel_build_dir)/gui"\r
-    }\r
-    & "$($iscc)" /Dpackage_dir="$($gui_build_dir)\package" /Dsource_dir="$($gpsbabel_src_dir)\gui" setup.iss\r
+    & "$($iscc)" /Doutput_dir="$($gui_build_dir)" /Dsource_dir="$($gpsbabel_src_dir)\gui" setup.iss\r
     if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) }\r
 }\r
 Set-Location "$($gpsbabel_src_dir)"\r